Reviewer Ask #1 — Before vs. After: every class, property and relationship that changes

Term-by-term delta between the as-delivered model (https://chubb.com/ontology/ins#) and the proposed refactor (https://data.chubb.com/ontology/ins/…). Every row cites the backlog story that carries it; the "After" column is implemented on branch refactor/claim-structural-fixes in the accompanying repo — review the ontology, not just this table.

Change types: SPLIT one term becomes several · NEW no counterpart before · RE-HOMED moved to the class it describes · RE-PLATFORMED schema enum → SKOS scheme · CORRECTED defective declaration fixed in place · RETIRED deprecated with no successor (derivable/redundant)

A — Classes

Before (as delivered)After (proposed)ChangeStoryWhy
ins:Claim ⊑ gist:Event — demand, loss, lifecycle, ledger and party register in one classclaim:Claim ⊑ core:Case (the demand only) · owl:disjointWith claim:LossSPLITCLM-1ACORD Claim ≠ ClaimsOccurrence; OMG P&C; project claim CQ model
— (no loss class exists)claim:Loss ⊑ core:Event — lossDate, lossDescription, lossLocation, causedByPerilNEWCLM-1/2Loss facts stated once; N claims per loss
— (cat is a mandatory string code on every claim)claim:CatastropheEvent ⊑ core:Event — catEventCode [1..1]NEWCLM-3Cat aggregation by IRI, not string join
— (lifecycle = 3 date literals)claim:ClaimEvent ⊑ core:Event + FnolEvent / OpeningEvent / ClosingEvent / ReopeningEvent (pairwise disjoint, OWL-Time + PROV-O)NEWCLM-4Reopen history, cycle times, audit trail (CQ-C10/C11)
ins:ClaimStatus ⊑ gist:Category — 8 display-string individuals incl. "In Subrogation"cstat: skos:ConceptScheme (/vocabulary/ins/claim-status/) — 7 concepts with notation + ACORD *Match; "In Subrogation" retiredRE-PLATFORMEDCLM-5Code lists are reference data (project codelist-SKOS standard)
ins:ClaimType ⊑ gist:Category — 5 values incl. "Subrogation"ctype: skos:ConceptScheme — 4 concepts; "Subrogation" retired (it is a process)RE-PLATFORMEDCLM-6One code-list pattern; type stats become meaningful
ins:PaymentType ⊑ gist:Category — zero values definedcpay: skos:ConceptScheme — Indemnity, Expense-ALAE, Expense-ULAE, Defense, RecoveryOffsetRE-PLATFORMEDCLM-11Empty class → populated governed list
— (amounts are undated bare decimals)claim:FinancialSummary — valuationDate [1..1] + four MoneyAmount linksNEWCLM-8Loss development reconstructible
— (money = xsd:decimal)core:MoneyAmount — hasAmount [1..1] + hasCurrency [1..1] → ISO-4217 concept; closeMatch FIBO & schema.org MonetaryAmountNEWCLM-7A bare decimal is not money
ins:Subrogation ⊑ gist:Event — empty class, 0 properties (plus a type value and a status value)claim:SubrogationProcess — subrogationOn [1..1], againstParty, recoveredAmount, outcomeSPLITCLM-12One construct instead of three (taxonomy trap)
ins:ReinsuranceClaim ⊑ gist:Event — originatingClaim optionalclaim:ReinsuranceClaim ⊑ claim:Claim — originatingClaim [1..1], agreement [1..1]CORRECTEDCLM-13It is a demand by the cedent — a Claim, anchored to its source
ins:LossHistory — policy/claim/claimant/insurer/status all as stringsclaim:LossHistory (evidence record) — optional IRI links aboutClaim / underReportedPolicy / claimant role; literals kept as dct:source evidence; status from cstat:CORRECTEDCLM-14Message-encoding antipattern; loss runs join the graph
ins:PartyRole — contextId string + RoleContext enum + roleCode stringparty:PartyRole — roleIn [1..1] (the context IRI), hasRoleType [1..1] (role scheme), isPlayedBy [1..1]CORRECTEDCLM-10 / rolesContext by IRI; kind as governed concept — see worked example
ins:Party ⊑ gist:Categoryparty:Party (properly typed — a party is a thing, not a classification)CORRECTEDrolesUpper-alignment error
ins:Underwriter ⊑ ins:PartyRole (+ 9 sibling role classes, typed twice via roleCode)party:UnderwriterRole (kept — carries authority level) + role:Underwriter skos:Concept; non-structure-bearing roles become concepts onlySPLITroles§2.4 test: class if it has structure, value if it doesn't
ins:CoveredPeril, ins:InsuranceCoverage — bare owl:Class rootsperil: skos:ConceptScheme; policy:InsuranceCoverage anchored under the agreement branchRE-PLATFORMEDPOL-562 untyped roots; perils are code-like values

B — Object properties (relationships)

BeforeAfterChangeStoryWhy
ins:claimOnPolicy (Claim→Policy, optional) + ins:hasClaim (Policy→Claim, hand-mirrored, no owl:inverseOf)claim:underPolicy [1..1 SHACL] · single owl:inverseOf policy:hasClaimCORRECTEDCLM-9/15No orphan claims; inverses can't drift
ins:hasClaimOnCoverage (Claim→Claim!) — doc describes coverage→claimremoved → claim:respondingCoverage (Claim→Coverage) · inverseOf policy:hasRespondingClaimCORRECTEDCLM-9Copy-paste domain error
ins:claimLocation (Claim→Location)claim:lossLocation (Loss→core:Place)RE-HOMEDCLM-2The loss happened somewhere, not the paperwork
ins:claimPeril (Claim→CoveredPeril)claim:causedByPeril (Loss→peril concept)RE-HOMEDCLM-2+ range becomes a governed concept
ins:claimantParty (Claim→Party)claim:claimant (Claim→claim:Claimant ⊑ party:PartyRole)CORRECTEDCLM-10Role reification; third-party claimants expressible with history
ins:hasAdjuster (Claim→Party)claim:hasAdjusterAssignment (→ AdjusterAssignment role with validity)CORRECTEDCLM-10Reassignment preserves history
ins:hasClaimStatus (→ ClaimStatus individual, 0..1)claim:hasClaimStatus (→ skos:Concept, [1..1], sh:in scheme; derived from event tail)RE-PLATFORMEDCLM-5Status = view of latest lifecycle event
ins:hasClaimType (→ ClaimType individual)claim:hasClaimType (→ ctype concept, [0..1], sh:in)RE-PLATFORMEDCLM-6
ins:paymentOnClaim (optional) / ins:hasClaimPayment (mirrored)claim:paymentOnClaim [1..1] · owl:inverseOf claim:hasClaimPaymentCORRECTEDCLM-11No orphan payments
ins:paymentType (→ empty PaymentType class)claim:paymentType (→ cpay concept, [1..1], sh:in)RE-PLATFORMEDCLM-11Indemnity/expense splits reconcile
ins:hasSubrogation (→ empty class)claim:subrogationOn [1..1] · inverseOf claim:hasSubrogationCORRECTEDCLM-12Canonical direction from the process
ins:originatingClaim (optional)claim:originatingClaim [1..1 SHACL]CORRECTEDCLM-13Gross-to-net never hits an unanchored recovery
NEW: claim:hasLoss [1..1] (+inv), partOfCatastrophe [0..1], hasClaimEvent [1..*], hasFinancialSummary [0..*], hasPaidTotal / hasOutstandingReserve / hasRecoveryTotal / hasExpensePaid, recoveredAmount, payeeNEWCLM-1..12The split model's connective tissue
ins:isRoleOf (role→Party) + ins:hasPartyRole (mirrored, no inverseOf)party:isPlayedBy [1..1] · single owl:inverseOf party:hasPartyRoleCORRECTEDroles
ins:roleContext (→ POLICY_TERM/CLAIM/GLOBAL enum) + ins:contextId (string!)party:roleIn [1..1] — the Policy/Claim/Quote IRI itself · inverseOf party:hasRoleCORRECTEDrolesString join → graph edge; enum redundant with target's type
ins:hasPolicyUnderwriter, ins:hasBackupUnderwriter (Policy→Underwriter, parallel to the role channel)deprecated → traversal: ?role party:roleIn ?policy ; hasRoleType role:Underwriter ; rolePriority 1|2RETIREDrolesOne channel, one truth — see worked example
ins:resultsInPolicy declared Policy→Policy ("Quote that produced this policy when bound")resultsInPolicy: Quote→Policy · owl:inverseOf originatedFromQuoteCORRECTEDPOL-1Declared domain contradicts its own definition

C — Data properties

BeforeAfterChangeStoryWhy
ins:claimNumber — mandatory flag, no uniqueness, no identifier semanticsclaim:claimId ⊑ dct:identifier — [1..1] + pattern + graph-wide uniqueness (SHACL-SPARQL)CORRECTEDCLM-15FunctionalProperty would MERGE duplicates; shapes report them
ins:dateReported / dateOpened / dateClosedretired → timestamps on FnolEvent / OpeningEvent / ClosingEvent (derived views during migration)RETIREDCLM-4Three literals can't hold a reopen history
ins:paidAmount / reserveAmount / recoveryAmount / claimExpenseAmount : xsd:decimalobject links to core:MoneyAmount inside a valuation-dated FinancialSummaryRE-PLATFORMEDCLM-7/8Currency + as-of date restored
ins:incurredAmount ("paid plus outstanding reserves")retired — computed; SHACL-SPARQL consistency check for feeds that ship itRETIREDCLM-8Never store a derivation
ins:catastropheEventCode — MANDATORY on every claimclaim:catEventCode — [1..1] on CatastropheEvent onlyRE-HOMEDCLM-3Non-cat claims carry nothing
ins:isCatastropheRelated : xsd:booleanretired — derivable from partOfCatastrophe link presenceRETIREDCLM-3
ins:paymentAmount : xsd:decimalclaim:paymentAmount → core:MoneyAmount [1..1]RE-PLATFORMEDCLM-11
LossHistory: lossClaimNumber / lossPolicyNumber / claimantName / lossInsurer / claimStatus — stringsIRI links (aboutClaim, underReportedPolicy, claimant role, insurer party) when resolved; literals kept as dct:source evidence; status → cstat conceptCORRECTEDCLM-14Five graph edges recovered from literals
ins:roleCode / roleCodeDescription — free strings per recordparty:hasRoleType → role concept; the code lives ONCE as skos:notation on the conceptRE-PLATFORMEDrolesNew file: vocabulary/ins/party-role/role-scheme.jsonld
ins:policyType, ins:policyLanguage + policyLanguageCodepolicy-type scheme; hasPolicyLanguage → ISO-639 concept (label + code = prefLabel + notation)RE-PLATFORMEDPOL-4Same fact stored twice, uncoordinated
ins:policyCancellationDate / cancellationDescription / cancellationTypeCode / cancellationNoticeDayspolicy:CancellationEvent (+ ReinstatementEvent) with OWL-Time + typed reasonSPLITPOL-3Cancel→reinstate→cancel history representable
owl:FunctionalProperty stamps on ~30 single-valued propertiesremoved → SHACL sh:maxCount 1 with named messagesCORRECTEDCLM-15Shapes count, axioms classify

D — Namespaces & IRIs

BeforeAfterChangeStoryWhy
https://chubb.com/ontology/ins#Claim — wrong host, hash IRI, one flat namespace for 170 classeshttps://data.chubb.com/ontology/ins/claim/ (schema) · /vocabulary/ins/…/ (SKOS) · /resource/… (instances) · versionIRI per NS-5/6/8CORRECTEDCLM-16Namespace policy NS-1..NS-8; bridge/legacy-claim-bridge.ttl maps every migrated term